package ve.com.wayoyo.wuml_case.DibujoDiagramas;

import ve.com.wayoyo.wuml_case.DataTipe;
import ve.com.wayoyo.wuml_case.UserPref;
import ve.com.wayoyo.wuml_case.Exceptions.AtributoERException;
import ve.com.wayoyo.wuml_case.Exceptions.CardinalityException;
import ve.com.wayoyo.wuml_case.Exceptions.MultiplicityException;
import ve.com.wayoyo.wuml_case.Exceptions.TipoDatoException;

public class CompAtributo {

	private String NombreVariable;
	private String TipoDato;
	private String NivelAcceso;
	private boolean isFinal;
	private boolean isStatic;
	private boolean isVolatile;
	private boolean _haveMultiplicity = false;
	private String _leftMultiplicity;
	private String _rightMultiplicity;

	public boolean isMultiplicity() {
		return _haveMultiplicity;
	}

	public void set_haveMultiplicity(boolean _haveMultiplicity) {
		this._haveMultiplicity = _haveMultiplicity;
	}

	public String get_leftMultiplicity() {
		return _leftMultiplicity;
	}

	public void set_leftMultiplicity(String _leftMultiplicity)
			throws MultiplicityException, CardinalityException {
		this._leftMultiplicity = _leftMultiplicity;
		if (this._leftMultiplicity.equals(""))
			throw new CardinalityException();
	}

	public String get_rightMultiplicity() {
		return _rightMultiplicity;
	}

	public void set_rightMultiplicity(String _rightMultiplicity)
			throws MultiplicityException, CardinalityException {
		this._rightMultiplicity = _rightMultiplicity;
		if (this._rightMultiplicity.equals(""))
			throw new CardinalityException();
		if (!this._rightMultiplicity.equals("*"))
			if ((Integer.valueOf(this._leftMultiplicity)) > (Integer
					.valueOf(this._rightMultiplicity)))
				throw new MultiplicityException();
	}

	public boolean isFinal() {
		return isFinal;
	}

	public void setFinal(boolean isFinal) {
		this.isFinal = isFinal;
	}

	public boolean isStatic() {
		return isStatic;
	}

	public void setStatic(boolean isStatic) {
		this.isStatic = isStatic;
	}

	public boolean isVolatile() {
		return isVolatile;
	}

	public void setVolatile(boolean isVolatile) {
		this.isVolatile = isVolatile;
	}

	public CompAtributo(String nombreVariable, String nivelAcceso) {
		NivelAcceso = nivelAcceso;
		NombreVariable = nombreVariable;
	}

	public CompAtributo(String nombreVariable, String nivelAcceso,
			String tipoDato) {
		NivelAcceso = nivelAcceso;
		NombreVariable = nombreVariable;
		TipoDato = tipoDato;
	}

	public CompAtributo() {
		// TODO Auto-generated constructor stub
	}

	public String getNivelAcceso() {
		return NivelAcceso;
	}

	public void setNivelAcceso(String nivelAcceso) {
		NivelAcceso = nivelAcceso;
	}

	public String getNombreVariable() {
		return NombreVariable;
	}

	public void setNombreVariable(String nombreVariable)
			throws AtributoERException {
		if (nombreVariable.equals(""))
			throw new AtributoERException();
		NombreVariable = nombreVariable;
	}

	public String getTipoDato() {
		return TipoDato;
	}

	public void setTipoDato(String tipoDato) throws AtributoERException,
			TipoDatoException {
		if (VistaDiagrama.getVista() != null) {
			if (tipoDato.equals(""))
				throw new AtributoERException();
			if (!DataTipe.getInstancia().dataExist(tipoDato))
				throw new TipoDatoException();
		}
		TipoDato = tipoDato;
	}

	public void setTipoDato(String tipoDato, String aux) {
		if (aux == "")
			TipoDato = tipoDato;
	}

	public String getText() {
		String Respuesta;
		if (NivelAcceso.equals("public")) {
			Respuesta = "+ ";
		} else if (NivelAcceso.equals("private")) {
			Respuesta = "- ";
		} else if (NivelAcceso.equals("protected")) {
			Respuesta = "# ";
		} else {
			Respuesta = "";
		}
		if (isFinal) {
			if (UserPref.getInstancia().getLanguaje().equals("C#"))
				Respuesta = Respuesta + "readonly ";
			else
				Respuesta = Respuesta + "final ";
		}
		if (isVolatile) {
			Respuesta = Respuesta + "volatile ";
		}

		Respuesta = Respuesta + NombreVariable + " : ";
		Respuesta = Respuesta + TipoDato;

		if (_haveMultiplicity) {
			try {
				int M = Integer.valueOf(_leftMultiplicity);
				int N;
				if (_rightMultiplicity.equals("*")) {
					if (M == 1) {
						Respuesta = Respuesta + " [*]";
					} else {
						Respuesta = Respuesta + " [" + M + "..*]";
					}
				} else {
					N = Integer.valueOf(_rightMultiplicity);
					if (M == N) {
						Respuesta = Respuesta + " [" + M + "]";
					} else {
						Respuesta = Respuesta + " [" + M + ".." + N + "]";
					}
				}
			} catch (Exception e) {
				System.out.println(e.getMessage());
			}
		}
		return Respuesta;
	}

	public String generarDOM() {
		String DOM = "\t\t<Atributo NombreVariable=\"" + NombreVariable
				+ "\" TipoDato=\"" + TipoDato + "\" NivelAcceso=\""
				+ NivelAcceso + "\" isFinal=\"" + isFinal + "\" isStatic=\""
				+ isStatic + "\" isVolatile=\"" + isVolatile + "\">\n";
		if (_haveMultiplicity)
			DOM = DOM + "\t\t\t<Multiplicidad Left=\"" + _leftMultiplicity
					+ "\" Right=\"" + _rightMultiplicity + "\" />\n";
		DOM = DOM + "\t\t</Atributo>\n";
		return DOM;
	}

	public String getCode(String Languaje) {
		String atrib = "";
		if (Languaje.equals("Java")) {
			if (!getNivelAcceso().equals("default"))
				atrib = atrib + getNivelAcceso() + " ";
			if (isVolatile)
				atrib = atrib + "volatile ";
			if (isStatic)
				atrib = atrib + "static ";
			if (isFinal)
				atrib = atrib + "final ";
			if (isMultiplicity()) {
				if (get_rightMultiplicity().equals("*")) {
					atrib = atrib + " ArrayList<" + getTipoDato() + ">";
					atrib = atrib + " " + getNombreVariable();
					atrib = atrib + " = new ArrayList<" + getTipoDato() + ">"
							+ "();";
				} else if (get_leftMultiplicity().equals(
						get_rightMultiplicity())) {
					atrib = atrib + getTipoDato() + "[] " + getNombreVariable();
					atrib = atrib + " = new " + getTipoDato() + "["
							+ get_leftMultiplicity() + "];";
				} else {
					atrib = atrib + getTipoDato() + "[] " + getNombreVariable();
					atrib = atrib + " = new " + getTipoDato() + "["
							+ get_rightMultiplicity() + "];";
				}
			} else {
				atrib = atrib + getTipoDato() + " " + getNombreVariable() + ";";
			}
		} else {
			if (!getNivelAcceso().equals("default"))
				atrib = atrib + getNivelAcceso() + " ";
			if (isVolatile)
				atrib = atrib + "volatile ";
			if (isStatic)
				atrib = atrib + "static ";
			if (isFinal)
				atrib = atrib + "readonly ";
			if (isMultiplicity()) {
				if (get_rightMultiplicity().equals("*")) {
					atrib = atrib + " List<" + getTipoDato() + ">";
					atrib = atrib + " " + getNombreVariable();
					atrib = atrib + " = new List<" + getTipoDato() + ">"
							+ "();";
				} else if (get_leftMultiplicity().equals(
						get_rightMultiplicity())) {
					atrib = atrib + getTipoDato() + "[] " + getNombreVariable();
					atrib = atrib + " = new " + getTipoDato() + "["
							+ get_leftMultiplicity() + "];";
				} else {
					atrib = atrib + getTipoDato() + "[] " + getNombreVariable();
					atrib = atrib + " = new " + getTipoDato() + "["
							+ get_rightMultiplicity() + "];";
				}
			} else {
				atrib = atrib + getTipoDato() + " " + getNombreVariable() + ";";
			}
		}
		return atrib;
	}
}
